package semac.control;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import semac.entidades.Alumno;
import semac.entidades.Cuenta;
import semac.entidades.Documento;

/**
 *
 * @author Ivan Ricardo Flores
 */
public class CtrlAlumnos {

    private ArrayList<Alumno> alumnos;
    private CtrlDocumentos manejadorDocumentos;
    private CtrlCuentas manejadorCuentas;
    private Conexion connection;
    private ResultSet resultado;
    private String query;
    private HttpServletRequest request;

    public CtrlAlumnos() throws IOException, ParserConfigurationException, SAXException{
        alumnos = new ArrayList();
        manejadorDocumentos = new CtrlDocumentos();
        manejadorCuentas = new CtrlCuentas();
        request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
        String urlFile =  request.getRealPath("/")+ "/WEB-INF/dataBase.xml";
        connection =  new Conexion(urlFile);
    }

    public void testConnection() throws ClassNotFoundException, SQLException{
        connection.startConnection();
        connection.closeConnection();
    }


    //Inicializa los documentos del alumno
    public void actualizarDocumentos(int codigoAlumno, int codigoDocumentos) throws ClassNotFoundException, SQLException{
        manejadorDocumentos.updateEstado(codigoAlumno, codigoDocumentos, false);
    }

    //Verifica si un alumno es apto para matricularse
    public boolean verificarEstadoAlumno(String usuario) throws ClassNotFoundException, SQLException, Exception{
        Cuenta cuenta = manejadorCuentas.getCuenta(usuario);
         connection.startConnection();
        query = "select codigo_estadomatricula"
                + " from semac.alumno"
                + " where codigo_persona = " + cuenta.getCodigoPersona();
        resultado = connection.execute(query);
        resultado.next();
        int estadoMatricula = resultado.getInt("codigo_estadomatricula");
        if (cuenta.getCodigoEstadoActividad() == 0 && estadoMatricula != 2)
            return false;
        return true;
    }

    //Retorna el alumno con la cuenta ingresada
    public Alumno getAlumno(String usuario) throws ClassNotFoundException,SQLException, Exception{
        Cuenta cuenta = manejadorCuentas.getCuenta(usuario);
        int codigoPer = cuenta.getCodigoPersona();
        Alumno alumno;
        connection.startConnection();
        query = "select *"
                + " from semac.alumno natural join semac.persona as aluper"
                + " where codigo_persona = " + codigoPer;
        resultado = connection.execute(query);
        resultado.next();
        String identidad = resultado.getString("identidad_persona");
        String nombre = resultado.getString("nombre_persona");
        String apellido = resultado.getString("apellido_persona");
        String telefono = resultado.getString("telefono_persona");
        String celular = resultado.getString("celular_persona");
        String domicilio = resultado.getString("domicilio_persona");
        char sexo = resultado.getString("sexo_persona").charAt(0);
        String email = resultado.getString("email_persona");
        Date tempDate = resultado.getDate("fechacreacion");
        GregorianCalendar fechaCreacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        tempDate = resultado.getDate("fechamodificacion");
        GregorianCalendar fechaModificacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        int ultimoAcceso = resultado.getInt("codigo_cuenta");
        int codigoPersona = resultado.getInt("codigo_persona");
        tempDate = resultado.getDate("fechanacimiento_alumno");
        GregorianCalendar fechaNacimiento = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        int codigoInstituto = resultado.getInt("codigo_institutoprocedencia");
        int codigoEstadoMatricula = resultado.getInt("codigo_estadomatricula");
        alumno = new Alumno(identidad, nombre, apellido, telefono, celular, domicilio,
        sexo, email, fechaCreacion,  fechaModificacion, ultimoAcceso,
        fechaNacimiento, codigoPersona, codigoInstituto, codigoEstadoMatricula);
        connection.closeConnection();
        return alumno;
    }

    //Retorna el código nombre del estado de matricula asociado al codigo
    public int getCodigoEstadoMatricula(String estado) throws ClassNotFoundException, SQLException{
        connection.startConnection();
        query = "select codigo_estadomatricula "
                + "from semac.estadomatricula "
                + "where descripcion_estadomatricula = '" + estado + "'";
        resultado = connection.execute(query);
        resultado.next();
        int codigoEstaMatricula = resultado.getInt("codigo_estadomatricula");
        connection.closeConnection();
        return codigoEstaMatricula;
    }
    
    //Retorna el nombre del estado de matricula asociado al codigo
    public int getEstadoMatricula(int codigoPersona) throws ClassNotFoundException, SQLException{
        connection.startConnection();
        query = "select codigo_estadomatricula "
                + "from semac.alumno "
                + "where codigo_persona = '" + codigoPersona + "'";
        resultado = connection.execute(query);
        resultado.next();
        int codigoEstaMatricula = resultado.getInt("codigo_estadomatricula");
        connection.closeConnection();
        return codigoEstaMatricula;
    }
    
    //Envía el nuevo estado de matrícula del alumno
    public void updateEstadoMatricula(int codigoPersona, int codigoEstado) throws ClassNotFoundException, SQLException{
        connection.startConnection();
        query = "update semac.alumno"
                + " set codigo_estadomatricula = " + codigoEstado
                + " where codigo_persona = " + codigoPersona;
        try{
        connection.execute(query);
        }catch(Exception ex){

        }
        connection.closeConnection();
    }
    
    //Retorna los alumnos cuyo estado es Prematriculado
    public ArrayList<Alumno> getAlumnosPrematriculados() throws ClassNotFoundException, SQLException{
        ArrayList<Alumno> prematriculados;
        prematriculados = new ArrayList();
        Alumno alumno;
        connection.startConnection();
        query = "select *"
                + " from semac.alumno natural join semac.persona as aluper"
                + " where codigo_estadomatricula = " + 1 ;
        resultado = connection.execute(query);
        while (resultado.next()){
            String identidad = resultado.getString("identidad_persona");
            String nombre = resultado.getString("nombre_persona");
            String apellido = resultado.getString("apellido_persona");
            String telefono = resultado.getString("telefono_persona");
            String celular = resultado.getString("celular_persona");
            String domicilio = resultado.getString("domicilio_persona");
            char sexo = resultado.getString("sexo_persona").charAt(0);
            String email = resultado.getString("email_persona");
            Date tempDate = resultado.getDate("fechacreacion");
            GregorianCalendar fechaCreacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
            tempDate = resultado.getDate("fechamodificacion");
            GregorianCalendar fechaModificacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
            int ultimoAcceso = resultado.getInt("codigo_cuenta");
            int codigoPersona = resultado.getInt("codigo_persona");
            tempDate = resultado.getDate("fechanacimiento_alumno");
            GregorianCalendar fechaNacimiento = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
            int codigoInstituto = resultado.getInt("codigo_institutoprocedencia");
            int codigoEstadoMatricula = resultado.getInt("codigo_estadomatricula");
            alumno = new Alumno(identidad, nombre, apellido, telefono, celular, domicilio,
            sexo, email, fechaCreacion,  fechaModificacion, ultimoAcceso,
            fechaNacimiento, codigoPersona, codigoInstituto, codigoEstadoMatricula);
            prematriculados.add(alumno);
        }
        return prematriculados;
    }
    
    //Verifica si existe un alumno con la cuenta ingresada
    public boolean existAlumno(String cuenta) throws ClassNotFoundException, SQLException, Exception{
        Cuenta cuentaAl = manejadorCuentas.getCuenta(cuenta);
        int codigoPer = cuentaAl.getCodigoPersona();
        connection.startConnection();
        query = "select *"
                + " from semac.alumno"
                + " where codigo_persona = " +  codigoPer;
        resultado = connection.execute(query);
        resultado.next();
        if (resultado.getRow() == 1){
            connection.closeConnection();
            return true;
        }
        connection.closeConnection();
        return false;
    }
    
    //método que retorna el código de la persona de un alumno
    public int getCodigoPersona(String identidad) throws ClassNotFoundException, SQLException{
        connection.startConnection();
        query = "select codigo_persona"
                + " from semac.persona"
                + " where identidad_persona = '" + identidad + "'";
        resultado = connection.execute(query);
        resultado.next();
        int codigoPer = resultado.getInt("codigo_persona");
        return codigoPer;
    }
    
    //Obtiene los datos de los alumnos de la base de datos
    public Alumno getAlumnoByCodigo(int codigoPer)throws ClassNotFoundException,SQLException{
        Alumno alumno;
        connection.startConnection();
        query = "select *"
                + " from semac.alumno natural join semac.persona as aluper"
                + " where codigo_persona = " +  codigoPer;
        resultado = connection.execute(query);
        resultado.next();
        String identidad = resultado.getString("identidad_persona");
        String nombre = resultado.getString("nombre_persona");
        String apellido = resultado.getString("apellido_persona");
        String telefono = resultado.getString("telefono_persona");
        String celular = resultado.getString("celular_persona");
        String domicilio = resultado.getString("domicilio_persona");
        char sexo = resultado.getString("sexo_persona").charAt(0);
        String email = resultado.getString("email_persona");
        Date tempDate = resultado.getDate("fechacreacion");
        GregorianCalendar fechaCreacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        tempDate = resultado.getDate("fechamodificacion");
        GregorianCalendar fechaModificacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        int ultimoAcceso = resultado.getInt("codigo_cuenta");
        int codigoPersona = resultado.getInt("codigo_persona");
        tempDate = resultado.getDate("fechanacimiento_alumno");
        GregorianCalendar fechaNacimiento = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        int codigoInstituto = resultado.getInt("codigo_institutoprocedencia");
        int codigoEstadoMatricula = resultado.getInt("codigo_estadomatricula");
        alumno = new Alumno(identidad, nombre, apellido, telefono, celular, domicilio,
        sexo, email, fechaCreacion,  fechaModificacion, ultimoAcceso,
        fechaNacimiento, codigoPersona, codigoInstituto, codigoEstadoMatricula);
        connection.closeConnection();
        return alumno;
    }
    
    //Obtiene los datos del alumno en base a la identidad 
    // en base al código del alumno
    public Alumno getAlumnoByIdentidad(String identidad) throws ClassNotFoundException,SQLException{
        Alumno alumno;
        connection.startConnection();
        query = "select *"
                + " from semac.alumno natural join semac.persona as aluper"
                + " where codigo_persona = '" +  identidad + "'";
        resultado = connection.execute(query);
        resultado.next();
        String identidadPer = resultado.getString("identidad_persona");
        String nombre = resultado.getString("nombre_persona");
        String apellido = resultado.getString("apellido_persona");
        String telefono = resultado.getString("telefono_persona");
        String celular = resultado.getString("celular_persona");
        String domicilio = resultado.getString("domicilio_persona");
        char sexo = resultado.getString("sexo_persona").charAt(0);
        String email = resultado.getString("email_persona");
        Date tempDate = resultado.getDate("fechacreacion");
        GregorianCalendar fechaCreacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        tempDate = resultado.getDate("fechamodificacion");
        GregorianCalendar fechaModificacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        int ultimoAcceso = resultado.getInt("codigo_cuenta");
        int codigoPersona = resultado.getInt("codigo_persona");
        tempDate = resultado.getDate("fechanacimiento_alumno");
        GregorianCalendar fechaNacimiento = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        int codigoInstituto = resultado.getInt("codigo_institutoprocedencia");
        int codigoEstadoMatricula = resultado.getInt("codigo_estadomatricula");
        alumno = new Alumno(identidadPer, nombre, apellido, telefono, celular, domicilio,
        sexo, email, fechaCreacion,  fechaModificacion, ultimoAcceso,
        fechaNacimiento, codigoPersona, codigoInstituto, codigoEstadoMatricula);
        connection.closeConnection();
        return alumno;
    }

    public void updateAlumno(Alumno alumno) throws ClassNotFoundException, SQLException{
        connection.startConnection();
        query = "update semac.persona" +
                " set identidad_persona = '" + alumno.getIdentidad() +
                "'," + "nombre_persona = '" + alumno.getNombre() + "'," + "apellido_persona = '" + alumno.getApellido() +
                "'," + "telefono_persona = '" + alumno.getTelefono() + "'," + "celular_persona = '" + alumno.getCelular() +
                "'," + "domicilio_persona = '" + alumno.getDomicilio() + "'," + "sexo_persona = '" + alumno.getSexo() +
                "'," + "email_persona = '" + alumno.getEmail() + "'," + "fechacreacion = '" + alumno.getFechaCreacion() +
                "'," + "fechamodificacion = '" + alumno.getFechaModificacion().getTime().getDate()
                + "/" + (alumno.getFechaModificacion().getTime().getMonth() + 1)
                + "/" + (alumno.getFechaModificacion().getTime().getYear() + 1900)
                + "'," + "semac.persona.codigo_cuenta" + alumno.getUltimoAcceso() +
                " where codigo_persona = " + alumno.getCodigo();
        try{
        connection.execute(query);
        }catch(Exception ex){

        }
        connection.closeConnection();

        connection.startConnection();
        query = "update semac.alumno"
                + " set codigo_persona = " + alumno.getCodigo()
                + "," + "fechanacimiento_alumno = '" + alumno.getFechaNacimiento().getTime().getDate()
                + "/" + (alumno.getFechaNacimiento().getTime().getMonth() + 1)
                + "/" + (alumno.getFechaNacimiento().getTime().getYear() + 1900)
                + "'," + "codigo_institutoprocedencia = " + alumno.getCodigoInstitutoProcedencia()
                + " where codigo_persona = " + alumno.getCodigo();
        try{
        connection.execute(query);
        }catch(Exception ex){

        }
        connection.closeConnection();
    }
    
    //Solicita al manejador de documentos entregados del alumno
    public ArrayList<Documento> getDocumentosEntregados(int codigoAlumno) throws ClassNotFoundException, SQLException{
        ArrayList<Documento> documentosEntregados = new ArrayList();
        documentosEntregados = manejadorDocumentos.getDocumentosEntregados(codigoAlumno);
        return documentosEntregados;
    }

    //Solicita al manejador de documentos los alumnos
    public ArrayList<Documento> getDocumentosPendientes(int codigoAlumno) throws ClassNotFoundException, SQLException{
        ArrayList<Documento> documentosPendientes = new ArrayList();
        documentosPendientes = manejadorDocumentos.getDocumentosPendientes(codigoAlumno);
        return documentosPendientes;
    }

    public void insetAlumno(Alumno alumno) throws ClassNotFoundException,SQLException{
        //En esta coneccion inserto los datos de la persona en la tabla semac.persona
        connection.startConnection();
        query = "insert into semac.persona (identidad_persona,nombre_persona,apellido_persona,"
                + "telefono_persona,celular_persona,domicilio_persona,sexo_persona,email_persona,"
                + "fechacreacion,fechamodificacion,codigo_cuenta)"
                + " values('" + alumno.getIdentidad()
                + "','" + alumno.getNombre() + "','" + alumno.getApellido()
                + "','" + alumno.getTelefono() + "','" + alumno.getCelular()
                + "','" + alumno.getDomicilio() + "','" + alumno.getSexo()
                + "','" + alumno.getEmail() + "','" + alumno.getFechaCreacion().getTime().getDate()
                + "/" + (alumno.getFechaCreacion().getTime().getMonth() + 1)
                + "/" + (alumno.getFechaCreacion().getTime().getYear() + 1900)
                + "','" + alumno.getFechaModificacion().getTime().getDate()
                + "/" + (alumno.getFechaModificacion().getTime().getMonth() + 1) 
                + "/" + (alumno.getFechaModificacion().getTime().getYear() + 1900)
                + "'," + alumno.getUltimoAcceso()+ ")";
        try{
        connection.execute(query);
        }catch(Exception ex){

        }
        connection.closeConnection();
        /* Se obtiene el codigo de la persona asignado al nuevo empleado
         para luego insertar sus datos en la tabla semac.empleado*/
        connection.startConnection();
        query = "select semac.persona.codigo_persona"
                + " from semac.persona"
                + " where semac.persona.identidad_persona = '" +  alumno.getIdentidad() + "'";
        resultado = connection.execute(query);
        resultado.next();
        int codigoPersona = Integer.parseInt((String)resultado.getObject("codigo_persona"));
        connection.closeConnection();

        //Se insertan los datos del empleado en la tabla semac.empleado
        connection.startConnection();
        query = "insert into semac.alumno (codigo_persona,"
                + "fechaconnacimiento_alumno,codigo_institutoprocedencia)"
                + " values(" + codigoPersona
                + ",'" + alumno.getFechaNacimiento().getTime().getDate()
                + "/" + (alumno.getFechaNacimiento().getTime().getMonth() + 1) 
                + "/" + (alumno.getFechaNacimiento().getTime().getYear() + 1900)
                + "'," + alumno.getCodigoInstitutoProcedencia() + ")";
        try{
        connection.execute(query);
        }catch(Exception ex){

        }
        connection.closeConnection();
    }

}